package com.feng.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Enumeration;

@Slf4j
//@Component
// 继承自ZuulFilter类
public class ZuulPreFilter extends ZuulFilter {

    // 设置filter类型，包含pre post error route 四种
    @Override
    public String filterType() {
        return "pre";
    }

    // filter执行优先级，越小优先级越高
    @Override
    public int filterOrder() {
        return 2;
    }

    // 该filter是都执行
    @Override
    public boolean shouldFilter() {
        return true;
    }

    // 在该filter中要执行的操作
    @Override
    public Object run() {
        // 获取请求中的基本信息
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        HttpServletResponse accountResponse = ctx.getResponse();
        
        // 获取请求头中的cookie
        Cookie[] cookies = request.getCookies();
        
        // 向请求头中加入 转发到下一级请求中需要的一些基本信息
//        ctx.addZuulRequestHeader(Constant.HEADER_UIN, tinyId);
//        ctx.addZuulRequestHeader(Constant.HEADER_APPID, "2");

        // 记录下请求内容
        log.info("send {} request to {} from {} ",
                request.getMethod(), request.getRequestURL().toString(), request.getRemoteAddr());

        /** * 验证账号登录态：/ticket/verify。 * 该请求的cookie中不能带IOV_ACCOUNT_SESSIONID，否则会返回一个新的IOV_ACCOUNT_SESSIONID， * 而这个新的sessionId不会跟随zuul进行下一次的账号系统请求，将出现session失效 * 且修改zuul请求中的cookie也是难上难(设计者的安全考虑) */
//        HttpHeaders requestHeaders = new HttpHeaders();
//        Enumeration<String> headerNames = request.getHeaderNames();
//        while (headerNames.hasMoreElements()) {
//            String key = headerNames.nextElement();
//            String value = request.getHeader(key);
//            // 跳过cookie设置
//            if (StringUtils.equalsIgnoreCase("cookie", key)) {
//                continue;
//            }
//            requestHeaders.add(key, value);
//        }

        // 设置cookie
//        if (cookies != null) {
//            for (Cookie cookie : cookies) {
//                if (StringUtils.equalsIgnoreCase(cookie.getName(), "IOV_ACCOUNT_SESSIONID") ||
//                        StringUtils.equalsIgnoreCase(cookie.getName(), "IAM_GATEWAY_SESSIONID")) {
//                    continue;
//                }
//                requestHeaders.add(HttpHeaders.COOKIE, cookie.getName() + "=" + cookie.getValue());
//            }
//        }
        return null;
    }
}
